import os
from flask import Flask, request, jsonify, send_file
from src.GC import noteAgent_LLM
from src.GC import noteAgent
from src.loader import web_loader_llm
from src.utils import file_operate


# 创建Flask应用
def create_app():
    # 创建应用实例
    app = Flask(__name__)
    # 定义路由
    @app.route('/')
    def index():
        # 从frontend文件夹加载HTML文件
        frontend_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'frontend', 'index.html')
        """
        1.__file__ - 获取当前文件(web.py)的完整路径
        2.os.path.dirname(__file__) - 获取当前文件所在的目录，即src/app/
        3.os.path.dirname(os.path.dirname(__file__)) - 获取上一级目录，即src/
        4.os.path.dirname(os.path.dirname(os.path.dirname(__file__))) - 获取再上一级目录，即项目的根目录
        5.os.path.join(..., 'frontend', 'index.html') - 将根目录与'frontend'和'index.html'拼接，形成完整的文件路径
        这样做的目的是确保无论在什么环境下运行程序，都能正确找到位于项目根目录下的frontend/index.html文件。
        这是为了适应不同操作系统（Windows、Linux、macOS）的路径分隔符差异，使用os.path.join()函数可以自动处理路径分隔符，保证程序的跨平台兼容性。
        
        即：
        当我们在 D:\data\code\Python\noteLLM\src\app\web.py 文件中使用 __file__ 时：
        1.__file__ 的值将是：D:\data\code\Python\noteLLM\src\app\web.py。
        这是当前文件(web.py)的完整绝对路径
        2.第一次 os.path.dirname(__file__) 将返回：D:\data\code\Python\noteLLM\src\app
        这是 web.py 文件所在的目录路径
        3.第二次 os.path.dirname(os.path.dirname(__file__)) 将返回：D:\data\code\Python\noteLLM\src
        这是上一级目录(src)的路径
        4.第三次 os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 将返回：D:\data\code\Python\noteLLM
        这是项目的根目录路径
        5.最终通过 os.path.join(..., 'frontend', 'index.html') 得到完整路径：D:\data\code\Python\noteLLM\frontend\index.html
        """
        with open(frontend_path, 'r', encoding='utf-8') as f:
            return f.read()

    @app.route('/generate/ai', methods=['POST'])
    def generate_ai():
        try:
            data = request.get_json()
            url = data.get('url')

            if not url:
                return jsonify({'error': 'URL不能为空'}), 400

            # 加载网页内容
            web_content = web_loader_llm.load_web_content(url)

            # 初始化LLM Chain
            llm_chain = noteAgent_LLM.init_llm_chain()

            # 调用LLM生成Markdown
            result = llm_chain.run({"web_content": web_content, "url": url})

            # 保存到本地文件
            filename = file_operate.save_markdown(result)

            return jsonify({'filename': filename})
        except Exception as e:
            return jsonify({'error': str(e)}), 500

    @app.route('/generate/web', methods=['POST'])
    def generate_web():
        try:
            data = request.get_json()
            url = data.get('url')

            if not url:
                return jsonify({'error': 'URL不能为空'}), 400

            # 生成并保存Markdown笔记
            filename = noteAgent.generate_markdown(url)

            return jsonify({'filename': filename})
        except Exception as e:
            return jsonify({'error': str(e)}), 500

    @app.route('/download/<filename>')
    def download(filename):
        try:
            # 构建web_notes文件夹路径
            web_notes_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'web_notes')
            # 构建完整文件路径
            file_path = os.path.join(web_notes_dir, filename)
            return send_file(file_path, as_attachment=True)
            # send_file() 尝试将指定文件作为附件发送给客户端，触发浏览器下载功能
            # as_attachment=True - 这个参数告诉浏览器应该下载文件而不是在浏览器中显示它
        except FileNotFoundError:
            return jsonify({'error': '文件未找到'}), 404

    return app